using UnityEngine;
using System.Collections.Generic;

public class bulletClass : MonoBehaviour {
	
	public float moveSpeed = 0.1f;
	private float anglez;
	private float xMove;
	float yMove;
	int timer = 0;
	public bool gameStopped = false;
    public globalVarsClass gv;
    public OTSprite me;
	public OTSprite bullet;

    public OTSprite shooter;
	
	public float dmg = 30; // базовый урон
	
	public float explosionRange = 0; // дальность сплеша
	public float explosionPower = 0; // процент повреждений, получаемых от сплеша
	public float explodeOnKillDamage = 0; // коэфф. повышения урона при смерти моба относительно базового урона
	public float explodeOnKillRange = 0; // радиус взрыва при смерти моба
	
	public int penitration = 0; // количество целей, сквозь которые снаяд может пройти
	public float penitrationDamageLost = 1.0f; // потеря урона при прохождениии сквозь противников от 0 - без потери до 1 - полная потеря.
	
	public int parts = 0; // количество осколков
	public int partsDamage = 0; //коэффициент повышения суммарного урон всех осколов относительно урона снаряда
	
	public float slowPower = 1.0f; // сила замедления от 1 - нет замедления до 0 - мгновенное замедление
	
	public OTSprite explosionSmall;
	public OTSprite explosionBig;
	public List<OTSprite> hitList = new List<OTSprite>(); //массив поражённых целей
	
	//инициализация
	void Start () {	
		gv = GameObject.Find("GlobalVariables").GetComponent<globalVarsClass>();
		me = this.GetComponent<OTSprite>();
		anglez = -transform.rotation.eulerAngles.z*Mathf.PI/180;
		xMove = moveSpeed*Mathf.Sin(anglez);
		yMove = moveSpeed*Mathf.Cos(anglez);
	}
	
	//движение
	public bool moveMe(){
		if(leftScreen()){
			return true;
		}
		this.gameObject.transform.position = new Vector3(this.gameObject.transform.position.x + xMove,
			this.gameObject.transform.position.y + yMove, -1);
		return false;
		
	}
	
	//проверка,не покинул ли снаряд экран
	public bool leftScreen(){
		if(this.transform.position.x > gv.width/2 || 
			this.transform.position.x < -gv.width/2 || 
			this.transform.position.y > gv.height/2 || 
			this.transform.position.y < -gv.height/2)
			{
				return true;
		}
		return false;
	}
	
	//функция уничтожающая цель
	private void killEnemy(int enemyNumber){
		if(explodeOnKillDamage <= 0 ){
			gv.removeEnemy(enemyNumber);
		}else{
			Vector2 mobPosition = new Vector2();
			mobPosition = gv.MobList[enemyNumber].position;
			gv.removeEnemy(enemyNumber);
			applayExplosion(-1, explodeOnKillRange, dmg*explodeOnKillDamage, 1-(1-slowPower)*explodeOnKillDamage, mobPosition);
		}
	}
	
	//нанесение повреждений всем противникам в заданном радиусе вокруг указанной точки кроме enemyHitted
	public void applayExplosion(int enemyHitted, float explosionSize, float damage, float slow, Vector2 explPosiotion){
			
		OTSprite nExplosion = (Instantiate(explosionBig.gameObject) as GameObject).GetComponent<OTSprite>();
	   	nExplosion.position = explPosiotion;
		nExplosion.GetComponent<GraphicClass>().scaleSpeed = -0.05f*explosionSize;
	       
		for(int i = 0; i < gv.MobList.Count; i++){
			if(i != enemyHitted && Vector2.Distance(gv.MobList[i].position, explPosiotion) < explosionSize){
				if(gv.MobList[i].GetComponent<badGuyClass>().takeDamage(damage, slow)){//applay splash
					killEnemy(i);
					i--;
				}
			}
		}
	}
	
	//Проверка пересечения пули и каждого из проивников
	public int checkHit(){
		for(int j = 0; j < gv.MobList.Count; j++){	
			if(this.transform.position.x < gv.MobList[j].transform.position.x + gv.MobList[j].rect.width/2 && 
				this.transform.position.x > gv.MobList[j].transform.position.x - gv.MobList[j].rect.width/2 && 
				this.transform.position.y < gv.MobList[j].transform.position.y + gv.MobList[j].rect.height/2 && 
				this.transform.position.y > gv.MobList[j].transform.position.y - gv.MobList[j].rect.height/2)
			{
				bool hitted = false;
				for(int i = 0; i < hitList.Count; i++){
					if(hitList[i] == gv.MobList[j]){
						hitted = true;
					}
				}
				if(hitted == false){
					return j;
				}
			}
		}
		return -1;
	}
	
	//добавление осколков
	public void addParts(OTSprite mainTarget){
		for(int i = 0; i < parts; i++){
			OTSprite nBullet = (Instantiate(bullet.gameObject) as GameObject).GetComponent<OTSprite>();
	        nBullet.position = me.position;
	        nBullet.rotation = Random.Range(0, 360);
			bulletClass bc = nBullet.GetComponent<bulletClass>();
			
			bc.hitList.Add(mainTarget);
			bc.dmg = dmg*partsDamage/parts;
			
			float sqrtPart = Mathf.Sqrt(parts);
			bc.explosionRange = explosionRange/sqrtPart;
			bc.explosionPower = explosionPower;
			bc.explodeOnKillDamage = explodeOnKillDamage/parts;
			bc.explodeOnKillRange = explodeOnKillRange/sqrtPart;
			bc.penitration = Mathf.CeilToInt(penitration/2);
			bc.penitrationDamageLost = penitrationDamageLost*2;
			bc.partsDamage = 0;
			bc.parts = 0;
			
			gv.bulletList.Add(nBullet);
		}
	}
	
	//основная функция попадания
	public bool hitEnemy(int enemyNumber){
		
		if(enemyNumber < 0){
			return false;	
		}
		
		if(parts > 0){
			addParts(gv.MobList[enemyNumber]);
		}
		
		OTSprite nExplosion = (Instantiate(explosionSmall.gameObject) as GameObject).GetComponent<OTSprite>();
	    nExplosion.position = this.transform.position;
	       
		if(gv.MobList[enemyNumber].GetComponent<badGuyClass>().takeDamage(dmg, slowPower)){ //damage main target
			killEnemy(enemyNumber);
		}
		if(explosionRange > 0){
			applayExplosion(enemyNumber, explosionRange, dmg*explosionPower, 1-(1-slowPower)*explosionPower, this.transform.position);
		}
		if(penitration > 0){
			penitration--;
			dmg *= (1-penitrationDamageLost);
			hitList.Add(gv.MobList[enemyNumber]);
			return false;
		}else{
			return true;
		}
		
	}
	
	// Update is called once per frame
	void Update () {
		//this.gameObject
		//this.gameObject.transform.position = new Vector3(this.gameObject.transform.position.x + xMove,
		//	this.gameObject.transform.position.y + yMove, -1);
		//Destroy(this);
		/*timer += 1;
		if(timer > 20){
			Destroy(this.gameObject);
		}*/
	//	this.gameObject.
	}
	/*void OnTriggerEnter(Collider collision) {
        if (collision.gameObject.name.Contains("BadGuy")){
			Destroy(collision.gameObject);
			Destroy(this.gameObject);
			gv.bulletList.Remove(this.gameObject);
		}
    }*/
}
